package com.imooc.product.controller;

import com.imooc.product.common.DecreaseStockInput;
import com.imooc.product.common.ProductInfoOutput;
import com.imooc.product.dataobject.ProductCategory;
import com.imooc.product.dataobject.ProductInfo;
import com.imooc.product.dto.CartDTO;
import com.imooc.product.service.ProductCategoryService;
import com.imooc.product.service.ProductInfoService;
import com.imooc.product.util.ResultVOUtil;
import com.imooc.product.vo.ProductInfoVO;
import com.imooc.product.vo.ProductVO;
import com.imooc.product.vo.ResultVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author steve
 * @date 2020/6/15 14:11
 */
@RestController
@RequestMapping("/product")
public class ProductInfoController {
    @Autowired
    private ProductInfoService productInfoService;
    @Autowired
    private ProductCategoryService productCategoryService;

    /**
     * 1. 查询所有在架的商品
     * 2. 获取类目type列表
     * 3. 查询类目
     * 4. 构造数据
     */

    @GetMapping("/list")
    @CrossOrigin(allowCredentials = "true") //允许cookie跨域
    public ResultVO<ProductInfo> list() {
//        try {
//            Thread.sleep(2000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        //1.查询所有在架的商品
        List<ProductInfo> productInfoList = productInfoService.findUpAll();

        //2. 获取类目type列表
        List<Integer> categoryTypeList = productInfoList.stream().map(ProductInfo::getCategoryType).collect(Collectors.toList());

        //3.查询类目
        List<ProductCategory> categoryList = productCategoryService.findByCategoryTypeIn(categoryTypeList);

        //4.构造数据
        /*
                {
            "code": 0,
            "msg": "成功",
            "data": [
                {
                    "name": "热榜",
                    "type": 1,
                    "foods": [
                        {
                            "id": "123456",
                            "name": "皮蛋粥",
                            "price": 1.2,
                            "description": "好吃的皮蛋粥",
                            "icon": "http://xxx.com",
                        }
                    ]
                },
                {
                    "name": "好吃的",
                    "type": 2,
                    "foods": [
                        {
                            "id": "123457",
                            "name": "慕斯蛋糕",
                            "price": 10.9,
                            "description": "美味爽口",
                            "icon": "http://xxx.com",
                        }
                    ]
                }
            ]
        }
         */
        //4.1 构造外层数据，对类目进行遍历
        List<ProductVO> productVOList = new ArrayList<>();
        for (ProductCategory productCategory : categoryList) {
            //构造类目数据
            ProductVO productVO = new ProductVO();
            productVO.setCategoryName(productCategory.getCategoryName());
            productVO.setCategoryType(productCategory.getCategoryType());

            //构造商品详情数据
            List<ProductInfoVO> productInfoVOList = new ArrayList<>();
            for (ProductInfo productInfo : productInfoList) {
                if (productInfo.getCategoryType().equals(productCategory.getCategoryType())) {
                    //如果商品的类目类型和商品类目的类型一致，则进行数据拷贝
                    ProductInfoVO productInfoVO = new ProductInfoVO();
                    BeanUtils.copyProperties(productInfo, productInfoVO);
                    productInfoVOList.add(productInfoVO);
                }
            }
            //构建商品详情数据集合
            productVO.setProductInfoVOList(productInfoVOList);
            //构建商品类目数据集合（包含商品详情数据集合）
            productVOList.add(productVO);
        }
        //返回数据给前端
        return ResultVOUtil.success(productVOList);
    }

    /**
     * 获取商品列表（给订单服务用的）
     * @param productIdList 商品id列表
     * @return
     */
    @PostMapping("/listForOrder")
    public List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList) {
//        try {
//            Thread.sleep(2000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        return productInfoService.listForOrder(productIdList);
    }

    /**
     * 扣减库存
     * @param decreaseStockInputList
     * @return
     */
    @PostMapping("/decreaseStock")
    public void decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList) {
        productInfoService.decrease(decreaseStockInputList);
    }
}
